#!/bin/bash

# 创建项目目录结构
mkdir -p project/include    # 存储头文件
mkdir -p project/src        # 存储源文件
mkdir -p project/data       # 存储数据文件
mkdir -p project/bin        # 存储可执行文件
mkdir -p project/obj        # 存储对象文件
mkdir -p project/img        # 存储图片 例如 README.md 的图片
mkdir -p project/log        # 存储日志文件

# 创建头文件并添加防止重复编译的宏
create_header() {
    local header_file=$1
    local header_guard=$(basename $header_file | tr '[:lower:]' '[:upper:]' | tr '.' '_')
    echo "#ifndef __${header_guard}__" > $header_file
    echo "#define __${header_guard}__" >> $header_file
    echo "" >> $header_file
    echo "// 引用头文件" >> $header_file
    echo "#include <head.h>" >> $header_file
    echo "// 声明函数" >> $header_file
    echo "" >> $header_file
    echo "#endif // __${header_guard}__" >> $header_file
}

 
# 创建头文件
create_header "project/include/head.h"      # 用户结构体和函数声明
create_header "project/include/user.h"      # 用户结构体和函数声明
create_header "project/include/login.h"     # 登录/注册功能函数声明
create_header "project/include/teacher.h"   # 教师模块函数声明
create_header "project/include/student.h"   # 学生模块函数声明
create_header "project/include/T_list.h"    # 老师用户->增删改查函数声明
create_header "project/include/S_list.h"    # 学生用户->增删改查函数声明
create_header "project/include/system.h"    # 工具函数声明

# 创建源文件
touch project/src/Login.c                  # 登录/注册功能实现
touch project/src/Teacher.c                # 教师功能实现 (查看留言)
touch project/src/Student.c                # 学生功能实现 (课表、九九乘法表、猜数字、计算器、留言)
touch project/src/T_list.c                 # 老师用户->增删改查功能实现
touch project/src/S_list.c                 # 学生用户->增删改查功能实现
touch project/src/system.c                 # 工具函数实现


# 创建数据文件
touch project/data/students.txt            # 学生数据文件
touch project/data/teachers.txt            # 教师数据文件
touch project/data/messages.txt            # 留言数据文件

# 在每个 .c 文件中插入 #include "head.h"
add_include_to_c() {
    local c_file=$1
    echo '#include "head.h"' | cat - $c_file > temp && mv temp $c_file
}

# 在 main.c 中添加内容
cat > project/src/main.c <<EOL
#include <head.h>

int main(int argc, char const *argv[])
{
    printf("Hello, all students of HQYJ_24071!\n");
    return 0;
}
EOL

# 对每个 .c 文件应用
add_include_to_c "project/src/Login.c"
add_include_to_c "project/src/Teacher.c"
add_include_to_c "project/src/Student.c"
add_include_to_c "project/src/T_list.c"
add_include_to_c "project/src/S_list.c"
add_include_to_c "project/src/system.c"

# 创建并写入 head.h 文件
cat > project/include/head.h <<EOL
#ifndef __HEAD_H__
#define __HEAD_H__

// 导入系统头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>

// 导入项目头文件
#include "head.h"
#include "user.h"
#include "login.h"
#include "teacher.h"
#include "student.h"
#include "T_list.h"
#include "S_list.h"
#include "system.h"


// 定义用户信息文件路径
#define STUDENTS "data/students.txt"       // 学生数据文件
#define TEACHERS "data/teachers.txt"       // 教师数据文件
#define MESSAGES "data/messages.txt"       // 留言数据文件


// 错误输出宏定义，写入日志文件并显示在终端
#define ERRLOG(msg) do { \
    time_t now = time(NULL); \
    char *timestr = ctime(&now); \
    timestr[strlen(timestr) - 1] = '\0'; /* 去掉末尾的换行符 */ \
    FILE *log_file = fopen(LOG_FILE, "a"); \
    if (log_file) { \
        fprintf(log_file, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n\n", \
                timestr, msg, __FILE__, __func__, __LINE__); \
        fclose(log_file); \
    } else { \
        fprintf(stderr, "错误: 无法打开日志文件: %s\n", LOG_FILE); \
    } \
    /* 输出到标准错误流 */ \
    fprintf(stderr, "[%s] 错误: %s\t文件: %s\t函数: %s\t行号: %d\n", \
            timestr, msg, __FILE__, __func__, __LINE__); \
} while (0)

#endif
EOL

# 产生 Makefile 文件
cat > project/Makefile <<EOL
# 编译器
CC = gcc

# 编译选项
CFLAGS = -Wall -g -I./include
LDFLAGS = -lncurses

# 目标文件
TARGET = ./bin/HQYJ_flight_system
LDFLAGS = -lncursesw
# -lncurses 

# 源文件目录和对象文件目录
SRC_DIR = ./src
OBJ_DIR = ./obj

# 源文件和对应的对象文件
SRCS = \$(wildcard \$(SRC_DIR)/*.c)
OBJS = \$(patsubst \$(SRC_DIR)/%.c, \$(OBJ_DIR)/%.o, \$(SRCS))

# 目标: 生成可执行文件
\$(TARGET): \$(OBJS)
	@mkdir -p \$(dir \$@)  # 确保目标目录存在
	\$(CC) \$(OBJS) -o \$@ \$(LDFLAGS)

# 生成对象文件
\$(OBJ_DIR)/%.o: \$(SRC_DIR)/%.c
	@mkdir -p \$(OBJ_DIR)  # 确保对象文件目录存在
	\$(CC) \$(CFLAGS) -c \$< -o \$@

# 清理目标
.PHONY: clean
clean:
	rm -f \$(OBJ_DIR)/*.o \$(TARGET)

EOL
